/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package treegen;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.util.Callback;

/**
 * Класс панели вкладки "Крона", считывающая параметры кроны
 *
 * @author Дарья
 */
public class CrownPanel {

    /**
     * Панель вкладки "Крона"
     */
    public VBox mainPane = new VBox();
    /**
     * КомбоБокс для выбора типа кроны
     */
    public static ComboBox COMBO_SHAPE = new ComboBox();
    /**
     * Панель для типа кроны
     */
    private HBox shape = new HBox();
    /**
     * КомбоБокс для выбора плотности кроны
     */
    public static ComboBox COMBO_DENSITY = new ComboBox();
    /**
     * Панель для плотности кроны
     */
    private HBox density = new HBox();
    /**
     * Картинка типа кроны
     */
    private ImageView image;
    /**
     * Текст для панелей
     */
    private Text text;
    /**
     * Кнопка "Снегерировать"
     */
    private Button generate;
    /**
     * Панель для сброса настроек
     */
    private HBox reset = new HBox();
    /**
     * Кнопка "Сбросить"
     */
    private Button buttonReset = getButton("Сбросить");
    /**
     * Панель для картинки типа кроны
     */
    public static HBox IMAGE_BOX = new HBox();

    /**
     * Конструктор, иницилизирующий панель для вкладки "Крона"
     *
     * @see CrownPanel
     * @param tree дерево
     */
    public CrownPanel(Tree tree) {
        final TreeGen t = tree.window;
        Callback<ListView<String>, ListCell<String>> factory = new Callback<ListView<String>, ListCell<String>>() {
            @Override
            public ListCell<String> call(ListView<String> list) {
                return new CrownPanel.ImageCell();
            }
        };

        //Комбобокс для формы кроны
        COMBO_SHAPE.getItems().addAll("Oтсутствует", "Вытянутая", "Пирамидальная", "Ярусная", "Плакучая",
                "Шарообразная", "Зонтичная", "Раскидистая");
        COMBO_SHAPE.getSelectionModel().selectedItemProperty().addListener(
                new ChangeListener() {
                    @Override
                    public void changed(ObservableValue ov, Object t, Object t1) {
                        buildShape();
                    }
                });
        COMBO_SHAPE.setCellFactory(factory);
        COMBO_SHAPE.setButtonCell(factory.call(null));
        COMBO_SHAPE.setValue("Oтсутствует");
        image = new ImageView(new Image(CrownPanel.class.getResourceAsStream("pictures/emptiness.png")));
        IMAGE_BOX.getChildren().clear();
        IMAGE_BOX.getChildren().addAll(image);

        text = new Text("Форма кроны: ");
        text.setFont(Font.font("Verdana", FontPosture.ITALIC, 14));
        shape.getChildren().addAll(text, COMBO_SHAPE);
        shape.setPadding(new Insets(0, 0, 10, 0));

        //Комбобокс для плотности кроны
        COMBO_DENSITY.getItems().addAll("Oтсутствует", "Плотная(просветы < 25%)", "Средняя(просветы 25 - 50%)", "Легкая(просветы > 50%)");
        COMBO_DENSITY.getSelectionModel().selectedItemProperty().addListener(
                new ChangeListener() {
                    @Override
                    public void changed(ObservableValue ov, Object t, Object t1) {
                        buildDensity();
                    }
                });
        COMBO_DENSITY.setCellFactory(factory);
        COMBO_DENSITY.setButtonCell(factory.call(null));
        COMBO_DENSITY.setValue("Oтсутствует");

        //Виджет для плотности кроны
        text = new Text("Плотность кроны: ");
        text.setFont(Font.font("Verdana", FontPosture.ITALIC, 14));
        density.getChildren().addAll(text, COMBO_DENSITY);
        density.setPadding(new Insets(0, 0, 10, 0));

        //Кнопка "Сбросить"
        text = new Text("Сбросить");
        text.setFont(Font.font("Verdana", FontWeight.BOLD, 14));
        buttonReset.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                clean();
            }
        });

        reset.getChildren().add(buttonReset);
        reset.setPadding(new Insets(20, 20, 0, 10));
        HBox button1 = new HBox();
        generate = getButton("Сгенерировать");
        generate.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                t.cleanCanvas();
                t.getValues();
            }
        });

        button1.getChildren().add(generate);
        button1.setPadding(new Insets(0, 20, 0, 10));
        reset.getChildren().add(button1);
        mainPane.getChildren().addAll(shape, IMAGE_BOX, density, reset);
        mainPane.setPadding(new Insets(5, 0, 5, 10));
    }

    /**
     * Получить кнопку в нужном стиле
     *
     * @param text текст кнопки
     * @return кнопка
     */
    private Button getButton(String text) {
        Button button = new Button(text);
        button.setStyle("-fx-background-color:grey;");
        button.setTextFill(Color.WHITE);
        button.setFont(Font.font("Verdana", FontWeight.BOLD, 12));
        return button;
    }

    /**
     * Очистить панель вкладки "Крона"
     */
    public void clean() {
        COMBO_SHAPE.setValue("Oтсутствует");
        image = new ImageView(new Image(CrownPanel.class.getResourceAsStream("pictures/emptiness.png")));
        IMAGE_BOX.getChildren().clear();
        IMAGE_BOX.getChildren().addAll(image);
        COMBO_DENSITY.setValue("Oтсутствует");
    }

    private static class ImageCell extends ListCell<String> {

        @Override
        public void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            if (item != null) {
                if (item.contains("Oтсутствует")) {
                    HBox emptytype = new HBox();
                    Text text = new Text("Oтсутствует");
                    text.setFont(Font.font("Verdana", 12));
                    emptytype.getChildren().addAll(text);
                    setGraphic(emptytype);
                } else if (item.contains("Пирамидальная")) {
                    HBox pyramidal = new HBox();
                    Text text = new Text("Пирамидальная");
                    text.setFont(Font.font("Verdana", 12));
                    pyramidal.getChildren().addAll(text);
                    setGraphic(pyramidal);
                } else if (item.contains("Вытянутая")) {
                    HBox elongated = new HBox();
                    Text text = new Text("Вытянутая");
                    text.setFont(Font.font("Verdana", 12));
                    elongated.getChildren().addAll(text);
                    setGraphic(elongated);
                } else if (item.contains("Ярусная")) {
                    HBox elongated = new HBox();
                    Text text = new Text("Ярусная");
                    text.setFont(Font.font("Verdana", 12));
                    elongated.getChildren().addAll(text);
                    setGraphic(elongated);
                } else if (item.contains("Плакучая")) {
                    HBox elongated = new HBox();
                    Text text = new Text("Плакучая");
                    text.setFont(Font.font("Verdana", 12));
                    elongated.getChildren().addAll(text);
                    setGraphic(elongated);
                } else if (item.contains("Шарообразная")) {
                    HBox elongated = new HBox();
                    Text text = new Text("Шарообразная");
                    text.setFont(Font.font("Verdana", 12));
                    elongated.getChildren().addAll(text);
                    setGraphic(elongated);
                } else if (item.contains("Зонтичная")) {
                    HBox elongated = new HBox();
                    Text text = new Text("Зонтичная");
                    text.setFont(Font.font("Verdana", 12));
                    elongated.getChildren().addAll(text);
                    setGraphic(elongated);
                } else if (item.contains("Раскидистая")) {
                    HBox elongated = new HBox();
                    Text text = new Text("Раскидистая");
                    text.setFont(Font.font("Verdana", 12));
                    elongated.getChildren().addAll(text);
                    setGraphic(elongated);
                } else if (item.contains("Плотная(просветы < 25%)")) {
                    HBox high = new HBox();
                    Text text = new Text("Плотная(просветы < 25%)");
                    text.setFont(Font.font("Verdana", 12));
                    high.getChildren().addAll(text);
                    setGraphic(high);
                } else if (item.contains("Средняя(просветы 25 - 50%)")) {
                    HBox average = new HBox();
                    Text text = new Text("Средняя(просветы 25 - 50%)");
                    text.setFont(Font.font("Verdana", 12));
                    average.getChildren().addAll(text);
                    setGraphic(average);
                } else if (item.contains("Легкая(просветы > 50%)")) {
                    HBox easy = new HBox();
                    Text text = new Text("Легкая(просветы > 50%)");
                    text.setFont(Font.font("Verdana", 12));
                    easy.getChildren().addAll(text);
                    setGraphic(easy);
                }
            }
        }
    }

    /**
     * Получить параметры кроны при изменении ее типа
     */
    public void buildShape() {
        IMAGE_BOX.getChildren().clear();
        String shape = (String) COMBO_SHAPE.getValue();
        if (shape.contains("Oтсутствует")) {
            image = new ImageView(new Image(CrownPanel.class.getResourceAsStream("pictures/emptiness.png")));
            IMAGE_BOX.getChildren().addAll(image);
            COMBO_DENSITY.setValue("Oтсутствует");
        } else {
            if (shape.contains("Вытянутая")) {
                image = new ImageView(new Image(CrownPanel.class.getResourceAsStream("pictures/elongated.jpg")));
                IMAGE_BOX.getChildren().addAll(image);
            } else if (shape.contains("Пирамидальная")) {
                image = new ImageView(new Image(CrownPanel.class.getResourceAsStream("pictures/pyramidal.jpg")));
                IMAGE_BOX.getChildren().addAll(image);
            } else if (shape.contains("Ярусная")) {
                image = new ImageView(new Image(CrownPanel.class.getResourceAsStream("pictures/tier.png")));
                IMAGE_BOX.getChildren().addAll(image);
            } else if (shape.contains("Плакучая")) {
                image = new ImageView(new Image(CrownPanel.class.getResourceAsStream("pictures/weep.jpg")));
                IMAGE_BOX.getChildren().addAll(image);
            } else if (shape.contains("Шарообразная")) {
                image = new ImageView(new Image(CrownPanel.class.getResourceAsStream("pictures/sphere.jpg")));
                IMAGE_BOX.getChildren().addAll(image);
            } else if (shape.contains("Зонтичная")) {
                image = new ImageView(new Image(CrownPanel.class.getResourceAsStream("pictures/umbrella.jpg")));
                IMAGE_BOX.getChildren().addAll(image);
            } else if (shape.contains("Раскидистая")) {
                image = new ImageView(new Image(CrownPanel.class.getResourceAsStream("pictures/branchy.jpg")));
                IMAGE_BOX.getChildren().addAll(image);
            }
            String str = (String) COMBO_DENSITY.getValue();
            if (str.contains("Oтсутствует")) {
                COMBO_DENSITY.setValue("Средняя(просветы 25 - 50%)");
            }
        }
    }

    /**
     * Получить параметры кроны при изменении ее плотности
     */
    public void buildDensity() {
        String d = (String) COMBO_DENSITY.getValue();
        String shape = (String) COMBO_SHAPE.getValue();
        if (d.contains("Oтсутствует") && !shape.contains("Oтсутствует")) {
            COMBO_SHAPE.setValue("Oтсутствует");
        }
    }

    /**
     * Получить параметры кроны
     */
    public static void getValues() {
        Crown.TYPE = (String) COMBO_SHAPE.getValue();
        Crown.DEN = (String) COMBO_DENSITY.getValue();
        if (Crown.DEN.contains("Плотная(просветы < 25%)")) {
            Crown.DENSITY = CrownDensity.dense;
        } else if (Crown.DEN.contains("Средняя(просветы 25 - 50%)")) {
            Crown.DENSITY = CrownDensity.average;
        } else if (Crown.DEN.contains("Легкая(просветы > 50%)")) {
            Crown.DENSITY = CrownDensity.easy;
        }
    }
}
